#ifndef outils_H
#define outils_H

#if defined (WIN32) || defined (_WIN32)
	#include <winsock2.h>
	#include <windows.h>
	#define	close closesocket
	#define msleep(ms) sleep(ms)
    #define sleep(x) Sleep(1000 * x)
	#define usleep(x) Sleep(x)
   	 typedef int socklen_t;
#elif defined (__linux) || defined (linux)
    #include <sys/types.h>
	#include <sys/socket.h>
	#include <netinet/in.h>
	#include <arpa/inet.h>
	#include <unistd.h>
	#define INVALID_SOCKET -1
	#define SOCKET_ERROR -1
	#define closesocket(s) close(s)
	typedef int SOCKET;
	typedef struct sockaddr_in SOCKADDR_IN;
	typedef struct sockaddr SOCKADDR;
#endif

#include <SDL/SDL.h>
#include <SDL/SDL_image.h>
#include <SDL/SDL_ttf.h>
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include <assert.h>
#include <ctype.h>
#include <string.h>

typedef enum {Haut, Bas, Droite, Gauche} te_Direction;
typedef enum {Vide, Ver, Plante, Poison, Vivifiant, Plante_seche, Non_comestible} te_Nourriture;
typedef enum {Rien, Petit, Moyen, Plein, Pierre} te_Etatterre;
typedef enum {Male, Femelle} te_Sexe;
typedef enum {Adulte, Jeune} te_Age;
typedef enum {Reproducteur, Guerrier, Defenseur, Cuisinier, Novice} te_Race;
typedef struct {te_Nourriture Nourriture; int ptNourriture; te_Etatterre eEtatterre; int eTaupes;} t_motte;
typedef struct {int ePosX; int ePosY; int eSante; te_Sexe Sexe; te_Age Age; int eGestation; int eDelaiGrossesse; te_Race Race; } t_rattaupes;
typedef struct element {t_rattaupes rattaupes; struct element *pred; struct element *succ;} t_element;
typedef struct {t_element *drapeau; t_element* ec;} t_liste;

#include "meoliste.h"

#define TAILLE_BLOC 25 /* Taille d'un bloc (carré) en pixels */
#define elmax 20
#define ecmax 20
#define HAUTEUR_FENETRE TAILLE_BLOC*elmax
#define LARGEUR_FENETRE TAILLE_BLOC*ecmax
#define ESPACE_MENU	100
#define PORT 23

void cmatBords (char c, int lmin, int cmin, int lmax, int cmax, char** mat);
void Alea0();
void rLigne ();
void cmatInit (char c, int lmax, int cmax, char** mat);
void ematInit (int e, int lmax, int cmax, int** mat);
void eAfficher (int entier);
void cAfficher (char caractere);
void meAfficher (char *sMessage, int eA);
void mcAfficher (char *sMessage, char cA);
void cmatAfficher (int lmin, int cmin, int lmax, int cmax, char** mat);
void ematAfficher (int lmax, int cmax, int** mat);
void espaceAfficher ();
int bCroiss (int eAv, int eM, int eAp);
int eEcrire ();
int cEcrire ();
int eHasard (int tmin, int tmax);
int zHasard (int eLimite);
int uHasard (int eMax);
int epMottenonvide (t_motte** pMotte);
void SDL_Ecrire(SDL_Surface* ecran, SDL_Surface *SDL_Texte, char* sTexte, int ePosX, int ePosY);
void SDL_Rect_Blanc(SDL_Surface* ecran, SDL_Surface *SDL_Clean, int eHauteur, int eLargeur, int ePosX, int ePosY);
void Rattaupe_Focus(SDL_Surface* ecran, t_rattaupes Rattaupe);
void Envoyer_pMotte(t_motte** pMotte, int32_t eNombreJoueur, int32_t eNombreJoueurPosition, int32_t eTour, SOCKET* csock);
void Recevoir_pMotte(t_motte** pMotte, int32_t eNombreJoueurIncremente, SOCKET* csock);
void Envoyer_pRattaupe(t_liste* pRattaupe, int32_t eNombreJoueurIncremente, SOCKET* csock);
void Recevoir_pRattaupe(t_liste* pRattaupe, int32_t eNombreJoueurIncremente, SOCKET* csock);
void Proposer_Quitter_enjeu (int eNombreJoueur, t_motte** pMotte, t_liste** pRattaupe, int* classement, SDL_Surface* ecran, SOCKET* csock, SOCKET* csockfin);
void Quitter (int eNombreJoueur, t_motte** pMotte, t_liste** pRattaupe, int* classement, SOCKET* csock, SOCKET* csockfin);
void MemoireVider(t_motte** pMotte, t_liste** pRattaupe, int32_t eNombreJoueur, int* classement);
void QuitterMenu();
void Envoyer_tour(int32_t eContinueJeu, int eNombre_joueur, SOCKET* csock);

#endif

